//: Playground - noun: a place where people can play

import UIKit

// 定义协议
protocol SportProtocol {
    func playBasketball()
    func playFootball()
}

// 遵守协议, 协议中的方法默认是必须实现的
class Teacher : SportProtocol {
    func playFootball() {
        print("踢足球")
    }

    func playBasketball() {
        print("打篮球")
    }
}


// 遵守协议
class Student : NSObject, SportProtocol {
    func playFootball() {
        print("踢足球")
    }

    func playBasketball() {
        print("打篮球")
    }
}


// 协议在代理设计模式中的使用
// 定义协议时, 协议后面最好跟上 : class, 意思是协议只能被类遵守
// delegate的属性使用weak, 防止循环引用
protocol BuyTicketDelegate : class {
    func buyTicket()
}

class Person {
    // 定义代理属性
    // 代理属性一般用weak
    weak var delegate : BuyTicketDelegate?

    func goToBeijing() {
        delegate?.buyTicket()
    }
}


// 让协议中的方法是可选方法
// optional属于OC特性, 如果协议中有可选方法, 那么必须在protocol前面加上@objc, 也需要在optional前面加上@objc
@objc protocol TestProtocal {
    @objc optional func test()
}

class Test : TestProtocal {
}